昨天我們完成了talker.py
這個Publisher
,今天要來做負責接收的Subscriber
囉!
一樣先到我們放程式的資料夾,並且下載官方範例,以及指定成可執行的檔案:
$ roscd beginner_tutorials/src
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/rospy_tutorials/001_talker_listener/listener.py
$ chmod +x listener.py
可以看到裡面其實是一個很簡單的15行程式:
1 #!/usr/bin/env python
2 import rospy
3 from std_msgs.msg import String
4
5 def callback(data):
6 rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
7
8 def listener():
9 rospy.init_node('listener', anonymous=True)
10 rospy.Subscriber("chatter", String, callback)
11 # spin() simply keeps python from exiting until this node is stopped
12 rospy.spin()
13
14 if __name__ == '__main__':
15 listener()
裡面最主要的就是callback
和listener
這兩個函式,先講listener
好了,也就是第8~12行:
8 def listener():
9 rospy.init_node('listener', anonymous=True)
10 rospy.Subscriber("chatter", String, callback)
11 # spin() simply keeps python from exiting until this node is stopped
12 rospy.spin()
首先一樣先定義了一個叫做listener
的node
,並且定義了一個Subscriber
,會去監聽chatter
這個topic
,透過String
格式的訊息傳輸,並在接收到訊息之後呼叫callback function
。
接著第12行就是可以讓這個node
不停止,就可以持續的監聽topic
有沒有新的訊息囉!
在收到訊息以後,會呼叫一個callback function
,也就是第5~6行所定義的callback
這個函式:
5 def callback(data):
6 rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
其實就是收到訊息(data)之後把它印出來啦!
執行畫面會長這樣:
左上角是roscore
執行畫面,右上可以看到有talker
和listener
這兩個node
在執行,並且有一個叫做/chatter
的topic
,左下角是publisher
,右下就是subscriber
接收到的畫面囉!
Subscriber
感覺比Publisher
簡單,但是要先知道Publisher
所定義的Topic
名稱和Messenge
格式,才能去監聽這個topic
。